<?php
	class Ajedrez {
		/* Array multidimensional que contendra el tablero */
		protected $tablero	= Array();
		protected $first		= True;
		protected $timeOut	= 2000;
		protected $anterior	= 0;
		protected $maxTime	= 1500;
		protected $minTime	= 250;
		protected $ficTime	= 150;
			
		public static function mostrarTablero($tipo = False) {
			/* creamos el objeto */
			$tablero = new ajedrez;
			/* inicializamos el objeto */
			$tablero->inicializarTablero();
			/* cargamos las fichas en el tablero */
			$tablero->crearFichas(True, 0, 1);
			$tablero->crearFichas(False, 7, 6);
			/* mostramos el tablero */
			$tablero->salidaHTML($tipo);
		}
		
		protected function inicializarTablero() {
			/* recorremos las filas */
			for ($i = 0; $i < 8; $i++) {
				/* recorremos las columnas */
				for ($j = 0; $j < 8; $j++) {
					/* le asignamos un color alternado de fondo (negro, blanco, negro...) */
					$this->tablero[$i][$j]['color'] = $this->getColor($i, $j);
					/* le asignamos un espacio vacio para la ficha */
					$this->tablero[$i][$j]['ficha'] = False;
				}
			}
		}
		
		protected function getColor($fila, $columna) {
			/* verificamos si la posicion es par o impar para retornar su color */
			return (((round(($fila + $columna) / 2) * 2) == ($fila + $columna)) ? True : False);
		}
		
		protected function crearFichas($color, $poderosos, $peones) {
			/* recorremos todas las posiciones de los peones */
			for ($i = 0; $i < 8; $i++)
				/* agregamos el peon en la posicion actual */
				$this->tablero[$peones][$i]['ficha'] = $this->getPeones($color);
			/* agregamos la torre de la esquina */
			$this->tablero[$poderosos][0]['ficha'] = $this->getTorre($color);
			/* agregamos el caballo de un lado */
			$this->tablero[$poderosos][1]['ficha'] = $this->getCaballo($color);
			/* agregamos el alfil de un lado */
			$this->tablero[$poderosos][2]['ficha'] = $this->getAlfil($color);
			/* agregamos un rey o reina dependiendo de la posicion y color */
			$this->tablero[$poderosos][3]['ficha'] = $this->getReyReina($color, $this->tablero[$poderosos][3]['color']);
			/* agregamos un rey o reina dependiendo de la posicion y color */
			$this->tablero[$poderosos][4]['ficha'] = $this->getReyReina($color, $this->tablero[$poderosos][4]['color']);
			/* agregamos el alfil del otro lado */
			$this->tablero[$poderosos][5]['ficha'] = $this->getAlfil($color);
			/* agregamos el caballo del otro lado */
			$this->tablero[$poderosos][6]['ficha'] = $this->getCaballo($color);
			/* agregamos la torre de la otra esquina */
			$this->tablero[$poderosos][7]['ficha'] = $this->getTorre($color);
		}
		
		protected function getPeones($color) {
			/* verificamos el color y enviamos su equivalente */
			return ($color ? "Peon Blanco" : "Peon Negro");
		}
		
		protected function getTorre($color) {
			/* verificamos el color y enviamos su equivalente */
			return ($color ? "Torre Blanca" : "Torre Negro");
		}
		
		protected function getCaballo($color) {
			/* verificamos el color y enviamos su equivalente */
			return ($color ? "Caballo Blanco" : "Caballo Negro");
		}
		
		protected function getAlfil($color) {
			/* verificamos el color y enviamos su equivalente */
			return ($color ? "Alfil Blanco" : "Alfil Negro");
		}
		
		protected function getReyReina($color, $colorTablero) {
			/* verificamos el color */
			return (
				/* verificamos el color del tablero y retornamos su equivalente */
				$color ? (
					/* el rey va en su color contrario (rey negro en casilla blanca) */
					$colorTablero ? "Rey Blanco" : "Reina Blanca"
				):(
					$colorTablero ? "Reina Negra" : "Rey Negro"
				)
			);
		}
		
		protected function salidaHTML($tipo) {
			/* mostramos la cabecera */
			$this->cabeceraHTML();
			/* mostramos la tabla */
			$this->tableroHTML();
			/* verificamos el tipo de jugada que se eligio */
			switch ($tipo) {
				case 'matePastor':
					/* animamos el jaque mate pastor */
					$this->jaqueMatePastor();
					break;
				default:
					/* si no se eligio nada o no se envio una opcion valida mostramos un mensaje */
					$this->showDefaultMensaje();
			}
			/* cerramos el body */
			$this->footerHTML();
		}
		
		protected function cabeceraHTML() {
			/* iniciamos el HTML */
			echo "<HTML>";
			/* iniciamos el HEAD */
			echo "</HEAD>";
			/* dentro del HEAD cargamos la hoja de estilos */
			$this->titulo();
			$this->hojaEstilos();
			/* y la funcion javascript que movera las fichas */
			$this->scriptJS();
			/* cerramos el HEAD */
			echo "</HEAD>";
			/* iniciamos el BODY */
			echo "<BODY>";
		}
		
		protected function titulo() {
			/* mostramos el titulo */
			echo "<TITLE>Ajedrez</TITLE>";
		}
		
		protected function hojaEstilos() {
			echo "<STYLE>";
				echo "table{border-color:#000;border-style:dashed;border-width:1px;}";
				echo "td{height:65px;width:65px;font-weight:bold;}";
				echo ".NEGRO{background-color:#000;color:#FFF;}";
				echo ".BLANCO{background-color:#FFF;}";
			echo "</STYLE>";
		}
		
		protected function scriptJS() {
			echo "<SCRIPT language='JavaScript'>";
				echo "function moverFicha(desde,hasta){";
					echo "desde=document.getElementById(desde);";
					echo "ficha=desde.innerHTML;";
					echo "desde.innerHTML='';";
					echo "document.getElementById(hasta).innerHTML=ficha;";
				echo "}";
			echo "</SCRIPT>";
		}
		
		protected function tableroHTML() {
			/* armamos la salida con una tabla sencilla */
			echo "<TABLE align='center'>";
			/* recorremos las filas */
			for ($i = 0; $i < 8; $i++) {
				/* iniciamos la fila */
				echo "<TR>";
				/* recorremos las columnas */
				for ($j = 0; $j < 8; $j++) {
					/* iniciamos la columna */
					echo "<TD id='$i$j' align='center' class='".(
						/* verificamos el color de la posicion actual */
						$this->tablero[$i][$j]['color'] ? "BLANCO" : "NEGRO"
					)."'>";
					/* mostramos la ficha en la posicion actual */
					echo $this->tablero[$i][$j]['ficha'];
					/* finalizamos la columna */
					echo "</TD>";
				}
				/* finalizamos la fila */
				echo "</TR>";
			}
			/* finalizamos la tabla */
			echo "</TABLE>";
			echo "<DIV id='mensaje' style='text-align:center;font-weight:bold;font-size:24px;color:#A00;'></DIV>";
		}
		
		protected function jaqueMatePastor() {
			/* iniciamos el JS */
			$this->iniciarJS();
			/* movemos el primer peon */
			$this->mover(64, 54, "E2 > E4");
			$this->mover(54, 44);
			/* movemos el segundo peon */
			$this->mover(16, 26, "G7 > G5");
			$this->mover(26, 36);
			/* movemos el alfil */
			$this->mover(75, 64, "F1 > C4");
			$this->mover(64, 53);
			$this->mover(53, 42);
			/* movemos un caballo */
			$this->mover("06", 16, "G8 > H6");
			$this->mover(16, 26);
			$this->mover(26, 27);
			/* movemos la reina */
			$this->mover(73, 64, "D1 > H5");
			$this->mover(64, 55);
			$this->mover(55, 46);
			$this->mover(46, 37);
			/* volvemos a mover el caballo */
			$this->mover(27, 26, "H6 > F5");
			$this->mover(26, 25);
			$this->mover(25, 35);
			/* ultimo movimiento! reina hacia rey */
			$this->mover(37, 26, "H5 > F7");
			$this->mover(26, 15);
			/* mostramos Haque Mate!!! */
			$this->showFinal('Jaque Mate!!!!');
			/* cerramos el script */
			$this->cerrarJS();
		}
		
		protected function showDefaultMensaje() {
			/* iniciamos el JS */
			$this->iniciarJS();
			/* mostramos la linea JS con el mensaje */
			echo "setTimeout(\"document.getElementById('mensaje').innerHTML='No se selecciono ninguna jugada';\",";
			/* el tiempo es un segundo mas despues de la ultima accion */
			echo ($this->timeOut + $this->minTime) . ");";
			/* cerramos el script */
			$this->cerrarJS();
		}
		
		protected function iniciarJS() {
			/* iniciamos la etiqueta JS */
			echo "<SCRIPT language='JavaScript'>";
		}
		
		protected function cerrarJS() {
			/* cerramos la etiqueta JS */
			echo "</SCRIPT>";
		}
		
		protected function footerHTML() {
			/* cerramos el BODY */
			echo "</BODY>";
			/* cerramos el HTML */
			echo "</HTML>";
		}
		
		protected function showFinal($msg) {
			/* mostramos la linea JS con el mensaje 'JAQUE MATE' */
			echo "setTimeout(\"document.getElementById('mensaje').innerHTML='$msg';\",";
			/* el tiempo es un segundo mas despues de la ultima accion */
			echo ($this->timeOut + $this->minTime) . ");";
		}
		
		protected function mover($desde, $hasta, $descrip = False) {
			/* calculamos el timeout. si la ficha es la que se esta moviendo es tiempo es 250, sino un aleatorio */
			$this->timeOut = $this->timeOut + (
				$this->anterior == $desde ? $this->ficTime : rand($this->minTime, $this->maxTime)
			);
			/* mostramos la linea JS */
			echo "setTimeout(\"moverFicha('$desde','$hasta');\"," . $this->timeOut . ");";
			/* guardamos la ficha que se movio */
			$this->anterior = $hasta;
		}
	}
?>